home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / AACD / Magazine / GraphicsCards / StormMesa / src / mthreads.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-04  |  4.9 KB  |  172 lines

  1. /* $Id: mthreads.c,v 1.2 1998/02/04 08:52:12 poliwoda Exp poliwoda $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  2.6
  6.  * Copyright (C) 1995-1998  Brian Paul
  7.  *
  8.  * This library is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Library General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2 of the License, or (at your option) any later version.
  12.  *
  13.  * This library is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Library General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Library General Public
  19.  * License along with this library; if not, write to the Free
  20.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22.  
  23. /*
  24.  * mthreads.c -- platform dependent thread support for Mesa 
  25.  *
  26.  * $Log$
  27.  *
  28.  * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
  29.  *                and Christoph Poliwoda (poliwoda@volumegraphics.com)
  30.  */
  31.  
  32. #include <stdio.h>  /* for printing errors etc. */
  33. #include <stdlib.h> /* malloc/free and the boys. */
  34. #include <errno.h>  /* error determination for system calls */
  35.                     /* NOTE: Some platforms will do bad things with errno  */
  36.                     /*       if correct compile-time options are not used. */
  37.                     /*       See mthreads.h for specific examples.         */
  38.  
  39.  
  40. /*
  41.  * This file should still compile even when THREADS is not defined.
  42.  * This is to make things easier to deal with on the makefile scene..
  43.  */
  44. #ifdef THREADS
  45. #include "mthreads.h" 
  46.  
  47.  
  48. /*
  49.  * POSIX Threads -- The best way to go if your platform supports them.
  50.  *                  Solaris >= 2.5 have POSIX threads, IRIX >= 6.4 reportedly
  51.  *                  has them, and many of the free Unixes now have them.
  52.  *                  Be sure to use appropriate -mt or -D_REENTRANT type
  53.  *                  compile flags when building.
  54.  */
  55. #ifdef PTHREADS
  56. void MesaInitTSD(MesaTSD * tsd) {
  57.   if (pthread_key_create(&tsd->key, free) != 0) {
  58.     perror(MESA_INIT_TSD_ERROR);
  59.     exit(-1);
  60.   }
  61. }
  62.  
  63. void * MesaGetTSD(MesaTSD * tsd) {
  64.   return pthread_getspecific(tsd->key);
  65. }
  66.  
  67. void MesaSetTSD(MesaTSD * tsd, void * ptr, void (*initfunc)(void)) {
  68.   pthread_once(&tsd->once, initfunc);
  69.   if (pthread_setspecific(tsd->key, ptr) != 0) {
  70.     perror(MESA_SET_TSD_ERROR);
  71.     exit(-1);
  72.   };
  73. }
  74.  
  75. #endif /* PTHREADS */
  76.  
  77.  
  78.  
  79. /*
  80.  * Solaris/Unix International Threads -- Use only if POSIX threads 
  81.  *   aren't available on your Unix platform.  Solaris 2.[34] are examples
  82.  *   of platforms where this is the case.  Be sure to use -mt and/or 
  83.  *   -D_REENTRANT when compiling.
  84.  */
  85. #ifdef SOLARIS_THREADS
  86. #define USE_LOCK_FOR_KEY    /* undef this to try a version without
  87.                    lock for the global key... */
  88.  
  89. void MesaInitTSD(MesaTSD * tsd) {
  90.   if ((errno = mutex_init(&tsd->keylock, 0, NULL)) != 0 ||
  91.       (errno = thr_keycreate(&(tsd->key), free)) != 0) {
  92.     perror(MESA_INIT_TSD_ERROR);
  93.     exit(-1);
  94.   }
  95. }
  96.  
  97. void * MesaGetTSD(MesaTSD * tsd) {
  98.   void* ret;
  99. #ifdef USE_LOCK_FOR_KEY
  100.   mutex_lock(&tsd->keylock);
  101.   thr_getspecific(tsd->key, &ret);
  102.   mutex_unlock(&tsd->keylock); 
  103. #else
  104.   if ((errno = thr_getspecific(tsd->key, &ret)) != 0) {
  105.     perror(MESA_GET_TSD_ERROR);
  106.     exit(-1);
  107.   };
  108. #endif
  109.   return ret;
  110. }
  111.  
  112. void MesaSetTSD(MesaTSD * tsd, void * ptr, void (*initfunc)(void)) {
  113.   /* the following code assumes that the MesaTSD has been initialized
  114.      to zero at creation */
  115.   fprintf(stderr, "initfuncCalled = %d\n", tsd->initfuncCalled);
  116.   if (tsd->initfuncCalled != INITFUNC_CALLED_MAGIC) {
  117.     initfunc();
  118.     tsd->initfuncCalled = INITFUNC_CALLED_MAGIC;
  119.   }
  120.   if ((errno = thr_setspecific(tsd->key, ptr)) != 0) {
  121.     perror(MESA_SET_TSD_ERROR);
  122.     exit(-1);
  123.   };
  124. }
  125.  
  126. #undef USE_LOCK_FOR_KEY
  127. #endif /* SOLARIS_THREADS */
  128.  
  129.  
  130.  
  131. /*
  132.  * Win32 Threads.  The only available option for Windows 95/NT.
  133.  * Be sure that you compile using the Multithreaded runtime, otherwise
  134.  * bad things will happen.
  135.  */  
  136. #ifdef WIN32
  137.  
  138. void MesaInitTSD(MesaTSD * tsd) {
  139.   tsd->key = TlsAlloc();
  140.   if (tsd->key == 0xffffffff) {
  141.     /* Can Windows handle stderr messages for non-console
  142.        applications? Does Windows have perror? */
  143.     /* perror(MESA_SET_INIT_ERROR);*/
  144.     exit(-1);
  145.   }
  146. }
  147.  
  148. void * MesaGetTSD(MesaTSD * tsd) {
  149.   return TlsGetValue(tsd->key);
  150. }
  151.  
  152. void MesaSetTSD(MesaTSD * tsd, void * ptr, void (*initfunc)(void)) {
  153.   /* the following code assumes that the MesaTSD has been initialized
  154.      to zero at creation */
  155.   if (tsd->initfuncCalled != INITFUNC_CALLED_MAGIC) {
  156.     initfunc();
  157.     tsd->initfuncCalled = INITFUNC_CALLED_MAGIC;
  158.   }
  159.   if (TlsSetValue(tsd->key, ptr) == 0) {
  160.     /* Can Windows handle stderr messages for non-console
  161.        applications? Does Windows have perror? */
  162.     /* perror(MESA_SET_TSD_ERROR);*/
  163.     exit(-1);
  164.   };
  165. }
  166.  
  167. #endif /* WIN32 */
  168.  
  169. #endif /* THREADS */
  170.  
  171.  
  172.